//package com.growthserver.util;
//
//
//import com.alibaba.fastjson.JSONObject;
//import com.ly.mp.component.identityUtils.UUIDUtils;
//import com.ly.mp.springcloudnacos.nacos.NacosConfigs;
//import org.apache.commons.lang.StringUtils;
//import org.apache.http.HttpResponse;
//import org.apache.http.client.config.RequestConfig;
//import org.apache.http.client.methods.HttpPost;
//import org.apache.http.conn.ConnectTimeoutException;
//import org.apache.http.entity.StringEntity;
//import org.apache.http.impl.client.CloseableHttpClient;
//import org.apache.http.impl.client.HttpClients;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.slf4j.MDC;
//import org.springframework.http.MediaType;
//
//import javax.servlet.http.HttpServletRequest;
//import java.io.BufferedReader;
//import java.io.InputStream;
//import java.io.InputStreamReader;
//import java.net.SocketTimeoutException;
//import java.util.Map;
//
//
///**
// * 网关2.0工具类
// * @author ly-yangchang
// * @date 2020年4月9日
// */
//public class GwUtils {
//
//	private static Logger logger = LoggerFactory.getLogger(GwUtils.class);
//
//	//添加共用httpClient
//	private static CloseableHttpClient httpClient = HttpClients.custom().evictExpiredConnections()
//			.setMaxConnTotal(Integer.valueOf(NacosConfigs.getPropDefaultIfBlank("http.max.conn.total","900")))
//			.setMaxConnPerRoute(Integer.valueOf(NacosConfigs.getPropDefaultIfBlank("http.max.conn.per.route","300")))
//			.setConnectionManagerShared(true).build();
//
//
//	/** 内部网关2.0地址 */
//
//	/**
//	 * 网关2.0，内部请求
//	 * @param desc		调接口干啥用
//	 * @param api		2.0接口
//	 * @param paramMap	请求参数
//	 * @param connect	连接超时时长
//	 * @param read		返回超时时长
//	 * @param reqId		继承上级请求header中的reqid
//	 * @return
//	 * @throws ConnectTimeoutException, SocketTimeoutException
//	 */
//	public static String innerPostGw2ByHeader(String gatewayV2, String desc, String api, Map<String, Object> paramMap,Map<String,Object> headerMap, int connect, int read, String reqId) throws ConnectTimeoutException, SocketTimeoutException {
//		long start = System.currentTimeMillis();
//		String param = JSONObject.toJSONString(paramMap);
//
//		HttpPost post = new HttpPost(gatewayV2);
//		String result = "";
//		try{
////			CloseableHttpClient httpClient = HttpClients.createDefault();
//			headerMap.forEach((headerKey,headerValue)->{
//				post.setHeader(headerKey, headerValue.toString());
//			});
//			// header
//			post.setHeader(MpConstant.API, api);
//			post.setHeader(MpConstant.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE);
//			post.setHeader(MpConstant.LANGUAGE, "Chinese");	// default Chinese
//			post.setHeader(MpConstant.TIMESTAMP, String.valueOf(System.currentTimeMillis()));
//			String str = UUIDUtils.getUUIDString();
//			post.setHeader(MpConstant.NONCESTR, str);
//			if (StringUtils.isNotBlank(reqId)) {
//				post.setHeader(MpConstant.REQUEST_ID, reqId);
//			} else {
//				post.setHeader(MpConstant.REQUEST_ID, str);
//			}
//
//			// 2020-06-01 add apiversion for gray
//			if (api != null && api.contains(",")) {
//				// api.pwd.verify = ly.oneapp.inner.cmd.check
//				// api.pwd.verify = ly.oneapp.inner.cmd.check, 2
//				// api.pwd.verify = ly.oneapp.inner.cmd.check, 1, 2
//				String apiVersion = api.substring(api.indexOf(",")+1, api.length()).trim();
//				post.setHeader(MpConstant.API, api.split(",")[0]);
//				post.setHeader(MpConstant.API_VERSION, apiVersion);
//			}
//
//			/* Print request log */
//			logger.info("[内部接口2.0] API{}, gw -> {}, header -> {}, param -> {}", api, gatewayV2, post.getAllHeaders(), param);
//
//			// timeout
//			RequestConfig requestConfig = RequestConfig.custom()
//					.setConnectTimeout(connect)
//					.setSocketTimeout(read)
//					.build();
//			post.setConfig(requestConfig);
//
//			// parameter
//			StringEntity parameter = new StringEntity(param,"utf-8");
//			post.setEntity(parameter);
//
//			// execute
//			HttpResponse response = httpClient.execute(post);
//
//			// response
//			InputStream in = response.getEntity().getContent();
//			BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8"));
//			StringBuilder strber= new StringBuilder();
//			String line = null;
//			while((line = br.readLine())!=null){
//				strber.append(line+'\n');
//			}
//			br.close();
//			in.close();
//			result = strber.toString();
////			if(response.getStatusLine().getStatusCode()!=HttpStatus.SC_OK){
////				result = "服务器异常";
////			}
//		} catch (ConnectTimeoutException e){
//			logger.error("ConnectTimeout! API:{}, param:{}", api, param, e);
//			throw e;
//		} catch (SocketTimeoutException e){
//			logger.error("SocketTimeout! API:{}, param:{}", api, param, e);
//			throw e;
//		} catch (Exception e){
//			logger.error("请求异常! API:{}, param:{}", api, param, e);
//		} finally{
//			post.abort();
//		}
//
//		/* Print response log */
//		logger.info("[内部接口2.0] API -> {}, result -> {}, spend -> {} ms", api, result, (System.currentTimeMillis() - start));
//		return result;
//	}
//
//	/** 内部网关2.0地址 */
//
//	/**
//	 * 网关2.0，内部请求
//	 * @param desc		调接口干啥用
//	 * @param api		2.0接口
//	 * @param paramMap	请求参数
//	 * @param connect	连接超时时长
//	 * @param read		返回超时时长
//	 * @param reqId		继承上级请求header中的reqid
//	 * @return
//	 * @throws ConnectTimeoutException, SocketTimeoutException
//	 */
//	public static String innerPostGw2(String gatewayV2, String desc, String api, Map<String, Object> paramMap, int connect, int read, String reqId) throws ConnectTimeoutException, SocketTimeoutException {
//		long start = System.currentTimeMillis();
//		String param = JSONObject.toJSONString(paramMap);
//
//		HttpPost post = new HttpPost(gatewayV2);
//		String result = "";
//		try{
//			CloseableHttpClient httpClient = HttpClients.createDefault();
//			// header
//			post.setHeader(MpConstant.API, api);
//			post.setHeader(MpConstant.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE);
//			post.setHeader(MpConstant.LANGUAGE, "Chinese");	// default Chinese
//			post.setHeader(MpConstant.TIMESTAMP, String.valueOf(System.currentTimeMillis()));
//			String str = UUIDUtils.getUUIDString();
//			post.setHeader(MpConstant.NONCESTR, str);
//			if (StringUtils.isNotBlank(reqId)) {
//				post.setHeader(MpConstant.REQUEST_ID, reqId);
//			} else {
//				post.setHeader(MpConstant.REQUEST_ID, str);
//			}
//
//			// 2020-06-01 add apiversion for gray
//			if (api != null && api.contains(",")) {
//				// api.pwd.verify = ly.oneapp.inner.cmd.check
//				// api.pwd.verify = ly.oneapp.inner.cmd.check, 2
//				// api.pwd.verify = ly.oneapp.inner.cmd.check, 1, 2
//				String apiVersion = api.substring(api.indexOf(",")+1, api.length()).trim();
//				post.setHeader(MpConstant.API, api.split(",")[0]);
//				post.setHeader(MpConstant.API_VERSION, apiVersion);
//			}
//
//			/* Print request log */
//			logger.info("[内部接口2.0] API{}, gw -> {}, header -> {}, param -> {}", api, gatewayV2, post.getAllHeaders(), param);
//
//			// timeout
//			RequestConfig requestConfig = RequestConfig.custom()
//					.setConnectTimeout(connect)
//					.setSocketTimeout(read)
//					.build();
//			post.setConfig(requestConfig);
//
//			// parameter
//			StringEntity parameter = new StringEntity(param,"utf-8");
//			post.setEntity(parameter);
//
//			// execute
//			HttpResponse response = httpClient.execute(post);
//
//			// response
//			InputStream in = response.getEntity().getContent();
//			BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8"));
//			StringBuilder strber= new StringBuilder();
//			String line = null;
//			while((line = br.readLine())!=null){
//				strber.append(line+'\n');
//			}
//			br.close();
//			in.close();
//			result = strber.toString();
////			if(response.getStatusLine().getStatusCode()!=HttpStatus.SC_OK){
////				result = "服务器异常";
////			}
//		} catch (ConnectTimeoutException e){
//			logger.error("ConnectTimeout! API:{}, param:{}", api, param, e);
//			throw e;
//		} catch (SocketTimeoutException e){
//			logger.error("SocketTimeout! API:{}, param:{}", api, param, e);
//			throw e;
//		} catch (Exception e){
//			logger.error("请求异常! API:{}, param:{}", api, param, e);
//		} finally{
//			post.abort();
//		}
//
//		/* Print response log */
//		logger.info("[内部接口2.0] API -> {}, result -> {}, spend -> {} ms", api, result, (System.currentTimeMillis() - start));
//		return result;
//	}
//
//	/**
//	 * 接口调用时继承或者生成request id
//	 * <p>
//	 * 仅在程序需要内部调用网关2.0接口时获取
//	 * @param request
//	 * @return
//	 */
//	public static String getReqId(HttpServletRequest request){
//		// 优先继承调用方请求ID
//		String reqId = request.getHeader(MpConstant.REQUEST_ID);
//		if (StringUtils.isBlank(reqId)) {
//			reqId = MDC.get(MpConstant.TRACE_ID);
//			if (StringUtils.isBlank(reqId)) {
//				reqId = UUIDUtils.getUUIDString();
//			}
//		}
//		return reqId;
//	}
//
//	/**
//	 * 网关2.0，外部请求userId必须从header获取
//	 * <p>
//	 * 内部网关请求，可以在body定义，但是建议仍然使用header中uid
//	 * @param request
//	 * @return
//	 */
//	public static String getUserId(HttpServletRequest request){
//		return request.getHeader(MpConstant.UID);
//	}
//
//
//
//
//
//}
